const router = require("koa-router")();
const JWT = require("jsonwebtoken");
const login = require("../utils/login");
const { secret, accessTokenTimer, refreshTokenTimer } = require('../utils/config')
/**
 * @swagger
 * /login: #接口访问路径(拼接上之前swagger.js中的host蛇者)
 *   post: #请求方式
 *     summary: 登录 有效期10秒钟  #接口信息
 *     description: 登录 有效期10秒钟 #接口描述
 *     tags: [用户] #接口分组
 *     produces:
 *       - application/x-www-form-urlencoded
 *     parameters: #传递参数
 *       - name: username #参数名字
 *         description: 用户名 #参数信息
 *         in: formData #参数存放位置formData是存放到请求体中
 *         required: true #是否是必传参数
 *         type: string #参数类型
 *         default: 906446244@qq.com
 *       - name: password
 *         description: 密码
 *         in: formData
 *         required: true
 *         type: string
 *         default: 123456
 *     responses: #返回结果
 *       200:
 *         description: 成功
 *         schema:
 *           type: object
 *           properties: 
 *             code: 
 *               type: string
 *               default: 200
 *             message: 
 *               type: string
 *               default: 登陆成功
 *             data:
 *               type: object
 *               properties: 
 *                  token:
 *                    type: string
 *                    default:  
 *                  userInfo: 
 *                    type: object
 *                    properties:
 *                      id:
 *                        type: string
 *                        description: id
 *                      username:
 *                        type: string
 *                        description: 用户名
 *                      tel:
 *                        type: string
 *                        description: 电话
 *                      nickname:
 *                        type: string
 *                        description: 昵称
 *                      avatar:
 *                        type: string
 *                        description: 头像
 *                      age:
 *                        type: string
 *                        description: 年龄
 *                      sex:
 *                        type: string
 *                        description: 性别
 *       400:
 *         description: 失败
 */
// 登陆
router.post("/login", async (ctx) => {
  const { username, password } = ctx.request.body;
  const result = await login.loginSql(username, password);
  if (result.length) {
    const user = result[0];
    delete user.password; 
    ctx.body = {
      code: 200,
      message: "登陆成功， 欢迎用户" + user.nickname,
      data: {
        userInfo: user,
        token: JWT.sign(user, secret, { expiresIn: accessTokenTimer }),
        refreshToken: JWT.sign(user, secret, { expiresIn: refreshTokenTimer }),
      },
    };
  } else {
    ctx.body = {
      code: 400,
      message: "账户密码错误， 请重新登陆",
    };
  }
});

/**
 * @swagger
 * /login/long: #接口访问路径(拼接上之前swagger.js中的host蛇者)
 *   post: #请求方式
 *     summary: 登录 有效期30分钟  #接口信息
 *     description: 登录 有效期30分钟 #接口描述
 *     tags: [用户] #接口分组
 *     produces:
 *       - application/x-www-form-urlencoded
 *     parameters: #传递参数
 *       - name: username #参数名字
 *         description: 用户名 #参数信息
 *         in: formData #参数存放位置formData是存放到请求体中
 *         required: true #是否是必传参数
 *         type: string #参数类型
 *         default: 906446244@qq.com
 *       - name: password
 *         description: 密码
 *         in: formData
 *         required: true
 *         type: string
 *         default: 123456
 *     responses: #返回结果
 *       200:
 *         description: 成功
 *         schema:
 *           type: object
 *           properties: 
 *             code: 
 *               type: string
 *               default: 200
 *             message: 
 *               type: string
 *               default: 登陆成功
 *             data:
 *               type: object
 *               properties: 
 *                  token:
 *                    type: string
 *                    default:  
 *                  userInfo: 
 *                    type: object
 *                    properties:
 *                      id:
 *                        type: string
 *                        description: id
 *                      username:
 *                        type: string
 *                        description: 用户名
 *                      tel:
 *                        type: string
 *                        description: 电话
 *                      nickname:
 *                        type: string
 *                        description: 昵称
 *                      avatar:
 *                        type: string
 *                        description: 头像
 *                      age:
 *                        type: string
 *                        description: 年龄
 *                      sex:
 *                        type: string
 *                        description: 性别
 *       400:
 *         description: 失败
 */
// 登陆
router.post("/login/long", async (ctx) => {
  const { username, password } = ctx.request.body;
  const result = await login.loginSql(username, password);
  if (result.length) {
    const user = result[0];
    delete user.password; 
    ctx.body = {
      code: 200,
      message: "登陆成功， 欢迎用户" + user.nickname,
      data: {
        userInfo: user,
        token: JWT.sign(user, secret, { expiresIn: accessTokenTimer * 6 * 30 }),
        refreshToken: JWT.sign(user, secret, { expiresIn: refreshTokenTimer }),
      },
    };
  } else {
    ctx.body = {
      code: 400,
      message: "账户密码错误， 请重新登陆",
    };
  }
});

/**
 * @swagger
 * /register: #接口访问路径(拼接上之前swagger.js中的host蛇者)
 *   post: #请求方式
 *     summary: 注册  #接口信息
 *     description: 注册 #接口描述
 *     tags: [用户] #接口分组
 *     produces:
 *       - application/x-www-form-urlencoded
 *     parameters: #传递参数
 *       - name: username #参数名字
 *         description: 用户名 #参数信息
 *         in: formData #参数存放位置formData是存放到请求体中
 *         required: true #是否是必传参数
 *         type: string #参数类型
 *       - name: password
 *         description: 密码
 *         in: formData
 *         required: true
 *         type: string
 *       - name: rePassword
 *         description: 重复密码
 *         in: formData
 *         required: true
 *         type: string
 *       - name: tel
 *         description: 电话
 *         in: formData
 *         required: true
 *         type: string
 *       - name: nickname
 *         description: 昵称
 *         in: formData
 *         required: true
 *         type: string
 *       - name: avatar
 *         description: 头像
 *         in: formData
 *         required: true
 *         type: string
 *       - name: age
 *         description: 年龄
 *         in: formData
 *         required: true
 *         type: number
 *       - name: sex
 *         description: 性别
 *         in: formData
 *         required: true
 *         type: string
 *
 *     responses: #返回结果
 *       200:
 *         description: 成功
 *       400:
 *         description: 失败
 */
// 注册
router.post("/register", async (ctx) => {
  const { username, password, rePassword, nickname, tel, avatar, age, sex } =
    ctx.request.body;
  if (password !== rePassword) {
    ctx.body = {
      code: 400,
      message: "两次密码不一致",
    };
    return;
  }
  const isExist = await login.isUsernameExist(username);
  if (isExist) {
    ctx.body = {
      code: 400,
      message: "该账号已经注册， 请重新注册",
    };
    return;
  }
  try {
    const result = await login.registerSql(ctx.request.body);
    if (result.insertId) {
      ctx.body = {
        code: 200,
        message: "注册成功",
      };
    }
  } catch (error) {
    ctx.body = {
      code: 400,
      message: "注册失败",
      error: error,
    };
  }
});

/**
 * @swagger
 * /user/info: #接口访问路径(拼接上之前swagger.js中的host蛇者)
 *   get: #请求方式
 *     summary: 获取用户信息接口  #接口信息
 *     description: 获取用户信息接口 #接口描述
 *     tags: [用户] #接口分组
 *     security:     
 *       - Authorization:
 *     responses: #返回结果 
 *       200:
 *         description: 成功
 *       400:
 *         description: 失败
 */
// 获取用户信息
router.get('/user/info', async ctx => {
  ctx.body = {
    code: 200,
    data: ctx.state.user
  }
})


/**
 * @swagger
 * /refresh/token: #接口访问路径(拼接上之前swagger.js中的host蛇者)
 *   get: #请求方式
 *     summary: 刷新token  #接口信息
 *     description: 刷新token #接口描述
 *     tags: [用户] #接口分组
 *     parameters: #传递参数
 *       - name: refreshToken #参数名字
 *         description: 长token #参数信息
 *         in: query #参数存放位置formData是存放到请求体中
 *         required: true #是否是必传参数
 *         type: string #参数类型
 *     responses: #返回结果
 *       200:
 *         description: 成功
 */
router.get('/refresh/token', ctx => {
  const { refreshToken } = ctx.request.query;
  console.log('--------------------')
  console.log(refreshToken)
  try {
    const result = JWT.verify(refreshToken, secret);
    delete result.iat
    delete result.exp

    ctx.body =  {
      code: 200,
      message: '刷新成功',
      data: {
        token: JWT.sign(result, secret, { expiresIn: accessTokenTimer }),
      }
    }
  } catch {
    ctx.body =  {
      code: 401,
      message: '长token 过期， 请重新登录',
    }
  }
  
})

module.exports = router;
